射频识别(RFID)技术

实验:选卡操作

作者:陈广 日期:2019-3-28


实验目的

通过本实验,掌握 ISO15693 电子标签的单张卡片选卡以及多卡片选卡操作。

ISO15693 协议卡的读取距离更长,同时读取多张卡片的性能比 ISO14443 更为强大。我们先从单次读取一张标签开始。

在我手上这台读写器上,ISO15693 标签的选取与 ISO14443 标签的选取有所不同。ISO14443 标签需要先请求,然后再防冲突,之后才能选中一张标签。ISO15693 使用的是询查(Inventory)虽然也要经过防冲突流程,询查已经整合的防冲突,不再需要单独调用防冲突流程即可返回单张或多张标签,并且可以通过标签的 AFI 过滤掉与请求 AFI 不符的标签。并且,每返回一张标签,就会将此标签置于静默状态,从而下次再询查时不会重复选中该标签。从而使得选择 ISO15693 标签相比之前在 ISO14443 标签请求实验中所做的内容大为简化。

每次选取一张标签

首先,新建一个 WPF 应用程序,界面代码如下:

<Window x:Class="I15693FormDemo.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:I15693FormDemo"
        mc:Ignorable="d"
        Title="ISO15693 选卡操作" Height="366.207" Width="272.414" Loaded="Window_Loaded">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="50"/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <Button Grid.Row="0" Content="选取一张标签" Margin="10,10,10.2,9.6" Grid.ColumnSpan="3" Click="Button_Click"/>
        <ListBox x:Name="lstCard" Grid.Row="1" Margin="10,0.4,10.2,10" Grid.ColumnSpan="3"/>
    </Grid>
</Window>

程序代码如下:

using HBLib;
using HBLib.HR8002Reader;
using HBLib.ISO15693;
using System;
using System.Threading.Tasks;
using System.Windows;

namespace I15693FormDemo
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        ComPort com = new ComPort("COM3", 19200, 300);
        Reader reader;
        I15693 i15693;

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            com.Open();
            reader = new Reader(0x00, com);
            i15693 = new I15693(0x00, com);
            reader.ChangeToISO15693Async();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            Inventory();
        }

        private async Task Inventory()
        {
            var info =await i15693.InventoryWithoutAFIAsync();
            this.Dispatcher.Invoke(new Action(() =>
            {
                lstCard.Items.Add(info.GetUIDStr());
            }));            
        }
    }
}

运行程序

运行程序,多次单击按钮进行选卡操作,最终结果如下图所示:

图 1:运行结果

我一共放了 6 张标签,要在不动标签的情况下读完 6 张标签几乎是不可能完成的任务。如果 6 张标签完全重叠放置,则一张标签都无法读出。从结果可知,我点了 13 次按钮,才读完 6 张标签,期间还得不信地移动标签。在询查完一张标签后,标签应该已处于静默状态,不会再被询查到,但最终还是有可能重复读取一张标签。可知此读写器选卡性能并不优异,当然,一分钱一分货,这个没什么好说的。结果中的全 0 表示没有选到任何标签。

思考题(难度 **):编写程序,循环进行询查操作直到读完 6 张标签后结束,标签的 UID 不会重复显示,询查期间可以移动标签。另外请注意,如果使用的是模拟器,就不要做这个思考题了,我并没有模拟这样的效果。

每次选取多张标签

HR8002 读写器还有扫描(InventoryScan)功能,它可以一次返回感应场内的多张标签。还可以选择继续扫描功能,从而不会返回重复标签。

将程序代码更改如下:

using HBLib;
using HBLib.HR8002Reader;
using HBLib.ISO15693;
using System;
using System.Threading.Tasks;
using System.Windows;

namespace I15693FormDemo
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        ComPort com = new ComPort("COM3", 19200, 300);
        Reader reader;
        I15693 i15693;
        bool isFirst = true;

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            com.Open();
            reader = new Reader(0x00, com);
            i15693 = new I15693(0x00, com);
            reader.ChangeToISO15693Async();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            InventoryScan();
        }

        private async Task InventoryScan()
        {
            InventoryScanInfo info;
            if (isFirst)
            {   //新的扫描
                info = await i15693.InventoryScanWithoutAFIAsync(InventoryScanWithoutAFIMode.NewScanWithoutAFI);
                isFirst = false;
            }
            else
            {   //继续扫描
                info = await i15693.InventoryScanWithoutAFIAsync(InventoryScanWithoutAFIMode.ContinueScanWithoutAFI);
            }
            this.Dispatcher.Invoke(new Action(() =>
            {
                foreach (var card in info.CardSet)
                {
                    lstCard.Items.Add(card.GetUIDStr());
                }
            }));
        }
    }
}

运行程序,这一次扫完所有标签就轻松多了,基本不会扫出重复的标签。当然,还是需要移动标签的位置方能扫完所有标签。

;

© 2018 - IOT小分队文章发布系统 v0.3